#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void listeCombinsPossibles(int somme,int cases,int tab[][11],char combiLouC[]);
void val_possibles_case_ligneoucolonne(char combiLouC[],char valcase[]);
void val_possibles_case_intersection(char valcase1[],char valcase2[],char valcase[]);
int minimCase(int nbCase);
int maxiCase(int nbCase);
int main()
{

    char combiLouC1[]="combiLouC1.txt";
    char valcase1[]="valcase1.txt";
    char combiLouC2[]="combiLouC2.txt";
    char valcase2[]="valcase2.txt";
    char valcase[]="valcase.txt";
    int p=0,puiss,f,caseUtilise=0,somme=0;
    int i=0,j=0;
    int tab[513][11]={{0,1,2,3,4,5,6,7,8,9}};
    puiss=pow(2,4);
/*remplir un tableau binaire pour pouvoir
apres extraire les differentes combinaisons possibles*/
for(i=0;i<=512;i++) {tab[i][0]=0;}
for(j=1;j<=9;j++)
{
        puiss=pow(2,j);
    for(i=1;i<=512;i+=puiss)
    {

        f=i+(puiss/2);

       for(p=i;(p<f);p++)
        {
            tab[p][j]=1;
            tab[p+puiss/2][j]=0;
        }
    }
}
/*remplir la 1er colonne par la somme de chaque ligne
et la derniere colonne par le nbre de chiffre utilisés
pour atteindre cette somme*/
for(i=1;i<=512;i+=1)
{
    somme=0;caseUtilise=0;
    for(j=1;j<=9;j+=1)
    {
        if(tab[i][j]==1) {somme+=j;caseUtilise+=1;}
    }
    tab[i][0]=somme;tab[i][10]=caseUtilise;

}
//afficher le tableau du combinaisons
/*for(i=0;i<=512;i++)
{
    for(j=0;j<=10;j++)
    {
    printf("%d ",tab[i][j]);
    }
   printf("\tligne %d\n",i);
}*/
listeCombinsPossibles(41,7,tab,combiLouC1);
/*exemple: extraire les differentes combinaison possibles qui permettre
d'obtenir la somme 17  en utilisant seulement 3 cases*/
listeCombinsPossibles(3,2,tab,combiLouC2);



val_possibles_case_ligneoucolonne(combiLouC1,valcase1);
/*stocker les valeurs possibles d'une case appartenant à une ligne
ou colonne et indépendement des autres lignes et colonnes
exemple: dans une ligne(8,3) chaque case a la possibilité de contenir
1 ou 2 ou 3 ou 4 ou 5 */
val_possibles_case_ligneoucolonne(combiLouC2,valcase2);
val_possibles_case_intersection(valcase1,valcase2,valcase);

return 0;
}

void listeCombinsPossibles(int somme,int cases,int tab[][11],char combiLouC[])
{


    int i,j,b=0;
    FILE *f;
    f=fopen(combiLouC,"w");
    if(f==NULL){printf("erreur");}
    else{
    for(i=0;i<=512;i++)
    {
        if(tab[i][0]==somme && (tab[i][10]==cases))
        {
            b=1;
            printf("\nvaleurs possibles:");
            for(j=1;j<=9;j++)
            {
            if(tab[i][j]==1) {fprintf(f,"%d ",j);printf("%d ",j);}
            }
            fprintf(f,"%d ",10);

        }
    }
    if(b==0) printf("pas de combinaison possible");
fclose(f);
}
printf("\n");
}

void val_possibles_case_ligneoucolonne(char combiLouC[],char valcase[])
{
    int c=0,k=0,b=0;
    FILE *g,*f;
    g=fopen(combiLouC,"r");
    f=fopen(valcase,"w+");     //ouverture du fichier contenant les combinaisons possibles d'une ligne ou colonne
    if((g==NULL)||(f==NULL)){printf("erreur");}
    else
        {while(!feof(g))
        {
            fscanf(g,"%d ",&k);b=0;
            while(!feof(f))
            {
                fscanf(f,"%d ",&c);   //tester si le chiffre dejà exite
                if((k==c)||(k==10)) {b=1;} //si oui on ne l'ajoute pas au fichier destination

            }
            if(b==0)            //si non on l'ajoute destination
            {
                fprintf(f,"%d ",k);
            }

            rewind(f);
        }
        fclose(f);
        fclose(g);
    }

}

void val_possibles_case_intersection(char valcase1[],char valcase2[],char valcase[])
{
    int k,c,b;
    FILE *h,*f,*g;
    g=fopen(valcase1,"r");
    f=fopen(valcase2,"r");
    h=fopen(valcase,"w");    //ouverture du fichier contenant les combinaisons possibles d'une ligne ou colonne
    if((f==NULL)||(g==NULL)||(h==NULL)){printf("erreur");}
    else{
    while(!feof(g))
    {
        fscanf(g,"%d ",&k);b=0;
        while(!feof(f))
        {

            fscanf(f,"%d ",&c);     //tester si le chiffre dejà exite
            if(k==c) {b=1;} //si oui on ne l'ajoute pas au fichier destination
        }

        if(b==1)            //si non on l'ajoute destination
        {
            fprintf(h,"%d ",k);
        }

        rewind(f);
    }

    }
    fclose(f);fclose(g);fclose(h);

}
